/**
 * 显示更新提示对话框
 * @param {Object} updateInfo - 更新信息
 * @param {string} updateInfo.downloadUrl - 下载地址
 * @param {string} updateInfo.version - 版本号
 * @param {string} updateInfo.description - 更新描述
 * @param {boolean} updateInfo.force - 是否强制更新
 */
export const showUpdateDialog = (updateInfo: any) => {
  uni.showModal({
    title: `发现新版本 v${updateInfo.version}`,
    content: updateInfo.description || '修复已知问题，优化用户体验',
    showCancel: !updateInfo.force,
    confirmText: '立即更新',
    cancelText: '稍后更新',
    success: (res) => {
      if (res.confirm) {
        downloadApk(updateInfo.downloadUrl)
      } else if (res.cancel && updateInfo.force) {
        // 强制更新时取消则退出应用
        plus.runtime.quit()
      }
    },
  })
}

/**
 * 下载更新文件
 * @param {string} downloadUrl - APK下载地址
 */
export const downloadApk = (downloadUrl: any) => {
  try {
    // 显示下载进度条
    uni.showLoading({
      title: '正在下载更新...',
      mask: true,
    })

    const downloadTask = uni.downloadFile({
      url: downloadUrl,
      filePath: `${plus.io.convertLocalFileSystemURL('_doc')}/update.apk`,
      success: (res) => {
        uni.hideLoading()
        if (res.statusCode === 200) {
          installApk(res.filePath)
        } else {
        }
      },
    })

    // 监听下载进度
    downloadTask.onProgressUpdate((progress) => {
      if (progress.progress % 10 === 0) {
        // 每10%更新一次提示
        uni.showLoading({
          title: `正在下载更新...${progress.progress}%`,
          mask: true,
        })
      }
    })
  } catch (error) {
    console.error('更新过程出错:', error)
    uni.showToast({
      title: '更新失败',
      icon: 'none',
      duration: 3000,
    })
    return false
  }
}

/**
 * 安装APK文件
 * @param {string} filePath - APK本地路径
 */
export const installApk = (filePath: any) => {
  return new Promise((resolve, reject) => {
    // 转换为本地路径
    const localPath = plus.io.convertLocalFileSystemURL(filePath)
    plus.runtime.install(
      localPath,
      {
        force: false, // 是否强制安装
      },
      () => {
        resolve(true)
        // 安装成功后重启应用
        plus.runtime.restart()
      },
      (err) => {
        reject(new Error(`安装失败: ${err.message}`))
      },
    )
  })
}

